From e78677f1a8676f5ce6cef9ccab9a0f2ebe3c54bd Mon Sep 17 00:00:00 2001 From: Massimo Valentini Date: Sat, 14 Jul 2012 17:07:38 +0200 Subject: [PATCH] extensions/gggl{,-lies}.c: round toward nearest in integer unpremultiplication from (docs/BablFishPath.html): ../extensions/.libs/gggl-lies.so 0: RaGaBaA u8 to RGBA u8 error: 0.001425 cost: 81 processings: 1 pixels: 128 ../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B'A u8 error: 0.001971 cost: 71 processings: 1 pixels: 128 ../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B' u8 error: 0.001971 cost: 71 processings: 1 pixels: 128 to: ../extensions/.libs/gggl-lies.so 0: RaGaBaA u8 to RGBA u8 error: 0.000031 cost: 81 processings: 1 pixels: 128 ../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B'A u8 error: 0.000042 cost: 61 processings: 1 pixels: 128 ../extensions/.libs/gggl.so 0: R'aG'aB'aA u8 to R'G'B' u8 error: 0.000042 cost: 61 processings: 1 pixels: 128 --- extensions/gggl-lies.c | 8 ++++---- extensions/gggl.c | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/extensions/gggl-lies.c b/extensions/gggl-lies.c index d56a50e..40e3fe0 100644 --- a/extensions/gggl-lies.c +++ b/extensions/gggl-lies.c @@ -1095,10 +1095,10 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples) } else { - unsigned int aa = (255 << 16) / src[3]; - *dst++ = (src[0] * aa) >> 16; - *dst++ = (src[1] * aa) >> 16; - *dst++ = (src[2] * aa) >> 16; + unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3]; + *dst++ = (src[0] * aa + 0x8000) >> 16; + *dst++ = (src[1] * aa + 0x8000) >> 16; + *dst++ = (src[2] * aa + 0x8000) >> 16; *dst++ = src[3]; } src += 4; diff --git a/extensions/gggl.c b/extensions/gggl.c index f1fb8c0..458de8d 100644 --- a/extensions/gggl.c +++ b/extensions/gggl.c @@ -1066,10 +1066,10 @@ conv_rgbA8_rgba8 (unsigned char *src, unsigned char *dst, long samples) } else { - unsigned int aa = (255 << 16) / src[3]; - *dst++ = (src[0] * aa) >> 16; - *dst++ = (src[1] * aa) >> 16; - *dst++ = (src[2] * aa) >> 16; + unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3]; + *dst++ = (src[0] * aa + 0x8000) >> 16; + *dst++ = (src[1] * aa + 0x8000) >> 16; + *dst++ = (src[2] * aa + 0x8000) >> 16; *dst++ = src[3]; } src += 4; @@ -1333,10 +1333,10 @@ conv_rgbA8_rgb8 (unsigned char *src, unsigned char *dst, long samples) } else { - unsigned int aa = (255 << 16) / alpha; - *dst++ = (src[0] * aa) >> 16; - *dst++ = (src[1] * aa) >> 16; - *dst++ = (src[2] * aa) >> 16; + unsigned int aa = ((255 << 16) + (alpha >> 1)) / alpha; + *dst++ = (src[0] * aa + 0x8000) >> 16; + *dst++ = (src[1] * aa + 0x8000) >> 16; + *dst++ = (src[2] * aa + 0x8000) >> 16; } src += 4; } -- 2.30.2